package Busquedas;

import java.util.ArrayList;
import Problemas.Problema;

public class CosteUniforme extends Busqueda{


	public CosteUniforme(Problema p) {
		super(p);
	}

	/**
	 Hereda de Busquedas,va extrayendo de los nodos abiertos el de menor coste
	 */
	public ArrayList<Estado> buscar(boolean controlCiclos){
		abiertos.add(this.getNodo());
		expandidos.add(this.getNodo().getEstado());
		boolean atascado = false;
		long tiempo1=System.currentTimeMillis();
		int indiceMenor;
		Nodo n;
		while(!abiertos.isEmpty() && !atascado){
			indiceMenor = this.indiceMenorCoste();
			n = abiertos.remove(indiceMenor);
			contadorNodos++;
			if (contadorNodos>maxContadorNodos) return null;
			for (int op = 0; op < this.getProblema().getnumOper(); op++){
				if (!this.getProblema().estadoFinal(n.getEstado())){
					if (n.getOperadoresAplicados()[op]!=1){
						Estado e=this.getProblema().aplicaOperador(n.getEstado(), op);
						n.setOperadoresAplicados(op);
						if (e!=null){
							if (!(controlCiclos && estaEnExpandidos(e))){
								Nodo n2 = n.anadeHijo(op,e,this.getProblema().getCosteOperador(op));
								abiertos.add(n2);
								expandidos.add(n2.getEstado());
								int inverso = this.getProblema().getOperadorInverso(op);
								if (inverso != -1) 
									n2.setOperadoresAplicados(inverso);
							}
						}
					}					
				}else{
					long tiempo2=System.currentTimeMillis();
					this.setTiempoTotal((tiempo2-tiempo1));
					generaCamino(n);				
					return camino;
				}
			}
		}
		return null;
	}


	/**
	Extrae el indice del array de abiertos cuyo coste acumulado es menor
	 */
	public int indiceMenorCoste(){
		int menor = abiertos.get(0).getCosteAcumulado();
		int indice = 0;
		for (int i = 0; i < abiertos.size(); i++){
			if (menor > abiertos.get(i).getCosteAcumulado()){
				menor = abiertos.get(i).getCosteAcumulado();
				indice = i;
			}
		}
		return indice;
	}
}
